package com.errol.batchprocessor.batchprocessor.advisor;

import com.renjia.entity.AbstractImportBatch;
import com.renjia.service.generic.middleware.batchprocessor.abs.AbstractAdvisor;
import com.renjia.service.generic.middleware.batchprocessor.payload.AbstractBatchPayload;
import com.renjia.service.generic.middleware.batchprocessor.payload.AbstractPiecePayload;
import com.renjia.service.generic.middleware.batchprocessor.payload.AbstractSinglePayload;
import org.springframework.lang.NonNull;

/**
 * 批次处理完成的扩展点
 * 需要注意：结算或重置扩展异常时，并没有处理异常的扩展点，但是可以在 doCleanUpOnBatchPost 扩展点检查状态并处理
 *
 * @author zhang xiao bin
 * @version v1.0
 * @date 2021/02/23
 * @since v5.0.5
 **/
public interface BatchFinishAdvisor<IE extends AbstractImportBatch, AT extends Enum<?>, BE, SE, BP extends AbstractBatchPayload<IE, AT, BE, SE>, PP extends AbstractPiecePayload<SE, SP>, SP extends AbstractSinglePayload<SE>>
        extends AbstractAdvisor<AbstractBatchPayload<IE, AT, BE, SE>> {

    /**
     * 批次所有分片成功完成时进行结算
     * 注意：结算过程异常不会触发批次重置的扩展点
     *
     * @param batchPayload 批次数据
     * @return true 表示执行成功，false 表示执行失败，拦截之后扩展
     */
    boolean doSettleOnBatchProcessed(@NonNull BP batchPayload);

    /**
     * 存在执行异常的分片时进行重置
     * 重置需慎重考虑，一般建议批处理优先考虑幂等
     *
     * @param batchPayload 批次数据
     * @param errorMessage 异常描述
     * @return true 表示执行成功，false 表示执行失败，拦截之后扩展
     */
    boolean doRecoverOnBatchException(@NonNull BP batchPayload, String errorMessage);
}
